package com.captain.leetcode.回溯算法;

import java.util.*;

/**
 * @author captain
 * @Des给定一个不含重复数字的数组 nums ，返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,2,3]
 * 输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
 * 示例 2：
 * <p>
 * 输入：nums = [0,1]
 * 输出：[[0,1],[1,0]]
 * 示例 3：
 * <p>
 * 输入：nums = [1]
 * 输出：[[1]]
 * @Date 2021/7/24 10:13
 */
public class 全排列46 {

    public static void main(String[] args) {
        int[] arr = new int[]{0,1};
        //permute(arr).forEach(System.out::println);
    }

    public  List<List<Integer>> permute(int[] nums) {
        int len = nums.length;
        List<List<Integer>> res = new ArrayList<>();
        Deque<Integer> path = new ArrayDeque<>();
        //排序组合
        dfs(nums, len, path, res);
        return res;
    }

    private  HashMap<Integer, Integer> map = new HashMap();

    private  void dfs(int[] nums, int len, Deque<Integer> path, List<List<Integer>> res) {
        //回溯条件
        if (path.size() == nums.length) {
            res.add(new ArrayList<>(path));
            return;
        }
        //[1,2,3]
        //遍历层级
        for (int i = 0; i < len; i++) {
            //没有剪枝叶操作
            if (map.containsKey(nums[i])) {
                continue;
            }
            path.add(nums[i]);
            //排除自己这个元素
            map.put(nums[i], 1);
            dfs(nums,len,path,res);
            path.removeLast();
            map.remove(nums[i]);
        }
    }
}
